gtk-demo: add menu check and radio examples
authorCaolán McNamara <caolanm@redhat.com>
Thu, 11 Feb 2016 16:48:51 +0000 (16:48 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 15 Feb 2016 13:41:22 +0000 (08:41 -0500)
note that if the "menu" context has no parent then the GTK_STATE_FLAG_NORMAL
menu entries are invisible against the white background.

https://bugzilla.gnome.org/show_bug.cgi?id=762080

demos/gtk-demo/foreigndrawing.c

index c3084f353a7030c61abea25f83fedcbc54f1775f..1ece6a2f0d54f5107dce62379c67c78bef86dd97 100644 (file)
@@ -145,30 +145,75 @@ draw_menu (GtkWidget     *widget,
 {
   GtkStyleContext *menu_context;
   GtkStyleContext *menuitem_context;
+  GtkStyleContext *hovermenuitem_context;
   GtkStyleContext *arrowmenuitem_context;
+  GtkStyleContext *checkmenuitem_context;
+  GtkStyleContext *radiomenuitem_context;
+  GtkStyleContext *disablemenuitem_context;
 
   /* This information is taken from the GtkMenu docs, see "CSS nodes" */
-  menu_context = get_style (NULL, "menu");
+  menu_context = get_style (gtk_widget_get_style_context(widget), "menu");
 
   gtk_render_background (menu_context, cr, x, y, width, height);
   gtk_render_frame (menu_context, cr, x, y, width, height);
 
-  menuitem_context = get_style (menu_context, "menuitem:hover");
-  gtk_render_background (menuitem_context, cr, x, y, width, 20);
-  gtk_render_frame (menuitem_context, cr, x, y, width, 20);
+  hovermenuitem_context = get_style (menu_context, "menuitem:hover");
+  gtk_render_background (hovermenuitem_context, cr, x, y, width, 20);
+  gtk_render_frame (hovermenuitem_context, cr, x, y, width, 20);
 
   /* arrow for left to right */
-  arrowmenuitem_context = get_style (menuitem_context, "arrow:dir(ltr)");
+  arrowmenuitem_context = get_style (hovermenuitem_context, "arrow:dir(ltr)");
   gtk_render_arrow (arrowmenuitem_context, cr, G_PI / 2, x + width - 20, y, 20);
+  g_object_unref (arrowmenuitem_context);
+
+  menuitem_context = get_style (menu_context, "menuitem");
   gtk_render_background (menuitem_context, cr, x, y + 20, width, 20);
   gtk_render_frame (menuitem_context, cr, x, y + 20, width, 20);
-  g_object_unref (arrowmenuitem_context);
 
-  /* arrow for right to left */
+  disablemenuitem_context = get_style (menu_context, "menuitem:disabled");
+
+  /* arrow for right to left, sensitive */
   arrowmenuitem_context = get_style (menuitem_context, "arrow:dir(rtl)");
   gtk_render_arrow (arrowmenuitem_context, cr, G_PI / 2, x, y + 20, 20);
+  g_object_unref (arrowmenuitem_context);
 
+  /* arrow for right to left, insensitive */
+  arrowmenuitem_context = get_style (disablemenuitem_context, "arrow:dir(rtl)");
+  gtk_render_arrow (arrowmenuitem_context, cr, G_PI / 2, x + width - 20, y + 20, 20);
+
+  gtk_render_background (menuitem_context, cr, x, y + 40, width, 20);
+  gtk_render_frame (menuitem_context, cr, x, y + 40, width, 20);
+
+  /* check enabled, sensitive */
+  checkmenuitem_context = get_style (menuitem_context, "check:checked");
+  gtk_render_frame (checkmenuitem_context, cr, x + 2, y + 40, 16, 16);
+  gtk_render_check (checkmenuitem_context, cr, x + 2, y + 40, 16, 16);
+  g_object_unref (checkmenuitem_context);
+
+  /* check unchecked, insensitive */
+  checkmenuitem_context = get_style (disablemenuitem_context, "check");
+  gtk_render_frame (checkmenuitem_context, cr, x + width - 18, y + 40, 16, 16);
+  gtk_render_check (checkmenuitem_context, cr, x + width - 18, y + 40, 16, 16);
+
+  gtk_render_background (menuitem_context, cr, x, y + 60, width, 20);
+  gtk_render_frame (menuitem_context, cr, x, y + 60, width, 20);
+
+  /* radio checked, sensitive */
+  radiomenuitem_context = get_style (menuitem_context, "radio:checked");
+  gtk_render_frame (radiomenuitem_context, cr, x + 2, y + 60, 16, 16);
+  gtk_render_option (radiomenuitem_context, cr, x + 2, y + 60, 16, 16);
+  g_object_unref (radiomenuitem_context);
+
+  /* radio unchecked, insensitive */
+  radiomenuitem_context = get_style (disablemenuitem_context, "radio");
+  gtk_render_frame (radiomenuitem_context, cr, x + width - 18, y + 60, 16, 16);
+  gtk_render_option (radiomenuitem_context, cr, x + width - 18, y + 60, 16, 16);
+
+  g_object_unref (disablemenuitem_context);
+  g_object_unref (radiomenuitem_context);
+  g_object_unref (checkmenuitem_context);
   g_object_unref (arrowmenuitem_context);
+  g_object_unref (hovermenuitem_context);
   g_object_unref (menuitem_context);
   g_object_unref (menu_context);
 }